FILE_NAME = '01_time.py'

# 一种上下文管理协议，目的在于简化try…except…finally的处理流程, with通过__enter__方法初始化，然后在__exit__中做善后以及处理异常
# 紧跟with后面的语句会被求值，__enter__()这个方法的返回值将被赋值给as关键字后面的变量，当with后面的代码块全部被执行完之后，
# 将调用前面返回对象的__exit__()方法， 被求值对象必须有__enter__()和__exit__()这两个方法，就可以通过自己实现这两方法来自定义with语句处理异常


# 打开文件的流程
fd = open(FILE_NAME)
try:
    for line in fd:
        print(line)
finally:
    fd.close()

# 出现异常时with会自动调用finally关闭文件, 用于对try except finally的优化，让代码更加美观
with open(FILE_NAME) as f:
    for line in f:
        print(line)


# 自定义上下文环境
class With(object):
    def __enter__(self):
        print('enter')

    def __exit__(self, exc_type, exc_val, exc_tb):
        if exc_tb is None:
            print('exit normally')
        else:
            print('exist with error: %s ' % exc_tb)


def fun():
    for i in range(5):
        print(i)


with With():
    print('running...')
    fun()
    # raise NameError('throw an error for test')
# enter
# running...
# 0
# 1
# 2
# 3
# 4
# exit normally
